﻿using System;
using Server;
using Server.Spells;
using Server.Mobiles;
using Server.Targets;
using AMA = Server.Items.ArmorMeditationAllowance;
using AMT = Server.Items.ArmorMaterialType;
using ABT = Server.Items.ArmorBodyType;

namespace Server.Items
{
    public class ArmaturaBase : BaseArmor
    {
        // Questi metodi vanno necessariamente ridefiniti.
        public virtual String DefNome { get { return "NomeDaDefinire"; } }
        public virtual double DefPeso { get { return -1.0; } }
        public virtual int DefDifesaBase { get { return 0; } }
        public virtual AMT DefTipoDiMateriale { get { return AMT.Piastre; } }
        public virtual Layer DefLayer { get { return Layer.Arms; } }

        // Queste sono settate a dei valori di default: possono essere ridefinite se necessario
        public virtual int DefMinPuntiStruttura { get { return 70; } }
        public virtual int DefMaxPuntiStruttura { get { return 110; } }
        public virtual int DefBonusStr { get { return 0; } }
        public virtual int DefBonusDex { get { return 0; } }
        public virtual int DefBonusInt { get { return 0; } }
        public virtual int DefBonusForza { get { return 0; } }
        public virtual bool DefIndossabileDaMaschio { get { return true; } }
        public virtual bool DefIndossabileDaFemmina { get { return true; } }
        public virtual int DefLivelloMinimo { get { return -1; } }
        public virtual int DefResistenzaFisici { get { return 0; } }
        public virtual int DefResistenzaFuoco { get { return 0; } }
        public virtual int DefResistenzaFreddo { get { return 0; } }
        public virtual int DefResistenzaElettricita { get { return 0; } }
        public virtual int DefResistenzaEnergia { get { return 0; } }
        public virtual int DefResistenzaAcido { get { return 0; } }

        // Costruttore
        public ArmaturaBase(int itemID) : base(itemID)
        {
        }

        public ArmaturaBase(Serial serial) : base(serial)
		{
		}

        [CommandProperty(AccessLevel.GameMaster)]
        public override double Weight
        {
            get
            {
                double modificatore = 0.0;

                // TODO: fare tutti i materiali
                switch (Resource)
                {
                    case CraftResource.Acciaio:
                        {
                            break;
                        }
                    case CraftResource.Adamantio:
                        {
                            break;
                        }
                    case CraftResource.Argento:
                        {
                            break;
                        }
                }

                return base.Weight + modificatore;
            }

            set
            {
                base.Weight = value;
            }
        }

        // Funzioni DNA, non toccare.
        [CommandProperty(AccessLevel.GameMaster)]
        public virtual String Nome { get { return DefNome; } }

        // Questa funzione definisce cosa viene mostrato nel gump che si apre in automatico quando
        // passo con il mouse sull'armatura.
        public override void GetProperties(ObjectPropertyList list)
        {
            // Nome armatura. Per tutto il resto c'e il .osserva
            // TODO: in futuro si potrebbe fare automatico con il mouse, ovvero si mostrano info in base a chi sta osservando.
            list.Add(Nome);
        }

        // Override della classe base, non toccare.
        public override int ArmorBase { get { return DefDifesaBase; } }
        public override bool AllowMaleWearer { get { return DefIndossabileDaMaschio; } }
        public override bool AllowFemaleWearer { get { return DefIndossabileDaFemmina; } }
        public override AMT MaterialType { get { return DefTipoDiMateriale; } }
        public override Layer Layer { get { return DefLayer; } }
        public override int InitMinHits { get { return DefMinPuntiStruttura; } }
        public override int InitMaxHits { get { return DefMaxPuntiStruttura; } }
        public override int BasePhysicalResistance { get { return DefResistenzaFisici; } }
        public override int BaseFireResistance { get { return DefResistenzaFuoco; } }
        public override int BaseColdResistance { get { return DefResistenzaFreddo; } }
        public override int BasePoisonResistance { get { return DefResistenzaElettricita; } }
        public override int BaseEnergyResistance { get { return DefResistenzaEnergia; } }
        public override int PhysicalResistance { get { return BasePhysicalResistance; } }
        public override int FireResistance { get { return BaseFireResistance; } }
        public override int ColdResistance { get { return BaseColdResistance; } }
        public override int PoisonResistance { get { return BasePoisonResistance; } }
        public override int EnergyResistance { get { return BaseEnergyResistance; } }

        public override int OnHit(BaseWeapon weapon, int damageTaken)
        {
            return base.OnHit(weapon, damageTaken);
        }

        public override bool OnEquip(Mobile from)
        {
            return true;
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
        }
    }
}
